package com.lqk.builder.improve;

/**
 * @author lqk
 * @date 2021/12/2 14:06
 *
 * 建造者模式的四个角色
 * 1) Product（产品角色）： 一个具体的产品对象。
 * 2) Builder（抽象建造者）： 创建一个Product对象的各个部件指定的 接口/抽象类。
 * 3) ConcreteBuilder（具体建造者）： 实现接口，构建和装配各个部件。
 * 4) Director（指挥者）： 构建一个使用Builder接口的对象。它主要是用于创建一个
 * 复杂的对象。它主要有两个作用，一是：隔离了客户与对象的生产过程，二是：
 * 负责控制产品对象的生产过程。
 *
 * 指挥者，这里去指定制作流程
 */
public class HouseDirector {
    HouseBuilder houseBuilder = null;

    // 通过构造器传入 HouseBuilder
    public HouseDirector(HouseBuilder houseBuilder) {
        this.houseBuilder = houseBuilder;
    }

    // 通过 setter 传入 HouseBuilder
    public void setHouseBuilder(HouseBuilder houseBuilder) {
        this.houseBuilder = houseBuilder;
    }

    // 如何处理建造房子的流程，交给指挥者
    public House constructHouse(){
        houseBuilder.buildBasic();
        houseBuilder.buildWalls();
        houseBuilder.roofed();
        return houseBuilder.buildHouse();
    }
}
